package demo;

import sun.security.krb5.internal.crypto.NullEType;

/**
 * 线程提供了一个方法,可以协调小城之间的同步运行
 * 同步运行:线程之间的执行存在先后顺序
 * 异步运行:线程之间的执行没有顺序,各干各的
 * 多线程本身就是异步运行的,但是某些业务场景需要线程在特定节点完成同步运行
 *
 * join方法允许一个线程在该方法所属的线程上等待(阻塞),知道其运行完毕后方可接触
 * 阻塞执行后续的代码.
 */
public class JoinDemo_1 {
    //表示图片是否下载完毕
    public static boolean isFinish;
    public static void main(String[] args) {
        /*
            java语法要求:
            一个方法局部内部类中若引用了这个方法的其他局部变量时
            该变量必须是final的.JDK8之后可以不显示的声明出来,但是要求仍然成立
         */
        //final boolean isFinish = false;
        Thread download = new Thread(){
          public void run(){
              System.out.println("down:开始下载图片---");
              for (int i = 0; i < 100; i++) {
                  System.out.println("down:"+i+"%");
                  try {
                      Thread.sleep(50);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }
              System.out.println("down:图片下载完毕!");
              isFinish = true;//表示图片下载完毕!
          }
        };
        Thread show = new Thread(){
           public void run(){
               System.out.println("show:开始显示文字---");
               try {
                   Thread.sleep(3000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               System.out.println("show:显示文字完毕!");
               System.out.println("show:开始显示图片---");
               //先等待dpwnload执行完毕(图片下载完毕)

               try {
                   System.out.println("show:等待download下载---");
                   download.join();
                   System.out.println("show:等待完毕!");
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               if(!isFinish){
                   System.out.println("加载图片失败!");
               }
               System.out.println("show:显示图片完毕!");
           }
        } ;
        download.start();
        show.start();
    }
}
